package com.ffggffgfv.backend.service.impl;

import com.ffggffgfv.backend.dto.UserPermissionDTO;
import com.ffggffgfv.backend.dto.UserRoleDTO;
import com.ffggffgfv.backend.entity.Role;
import com.ffggffgfv.backend.entity.UserRole;
import com.ffggffgfv.backend.mapper.PermissionMapper;
import com.ffggffgfv.backend.mapper.RoleMapper;
import com.ffggffgfv.backend.mapper.UserRoleMapper;
import com.ffggffgfv.backend.service.UserRoleService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.List;

/**
 * 用户角色服务实现类
 */
@Service
public class UserRoleServiceImpl implements UserRoleService {

    @Autowired
    private UserRoleMapper userRoleMapper;

    @Autowired
    private RoleMapper roleMapper;

    @Autowired
    private PermissionMapper permissionMapper;

    /**
     * 分配用户角色
     *
     * @param userId      用户ID
     * @param userRoleDTO 角色ID列表DTO
     * @return 是否成功
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public boolean assignRoles(Long userId, UserRoleDTO userRoleDTO) {
        // 先删除当前用户的所有角色关联
        userRoleMapper.deleteByUserId(userId);

        // 如果角色ID列表为空，则直接返回成功
        if (userRoleDTO.getRoleIds() == null || userRoleDTO.getRoleIds().isEmpty()) {
            return true;
        }

        // 构建用户角色关联对象列表
        List<UserRole> userRoles = new ArrayList<>();
        Date now = new Date();

        for (Long roleId : userRoleDTO.getRoleIds()) {
            UserRole ur = new UserRole();
            ur.setUserId(userId);
            ur.setRoleId(roleId);
            ur.setCreateTime(now);
            userRoles.add(ur);
        }

        // 批量插入用户角色关联
        return userRoleMapper.batchInsert(userRoles) > 0;
    }

    /**
     * 获取用户的角色列表
     *
     * @param userId 用户ID
     * @return 角色列表
     */
    @Override
    public List<Role> getUserRoles(Long userId) {
        return roleMapper.selectByUserId(userId);
    }

    /**
     * 获取用户的角色ID列表
     *
     * @param userId 用户ID
     * @return 角色ID列表
     */
    @Override
    public List<Long> getUserRoleIds(Long userId) {
        return userRoleMapper.selectRoleIdsByUserId(userId);
    }

    /**
     * 获取当前用户的权限信息
     *
     * @param userId 用户ID
     * @return 用户权限DTO
     */
    @Override
    public UserPermissionDTO getCurrentUserPermissions(Long userId) {
        // 获取用户角色编码列表
        List<String> roleCodes = userRoleMapper.selectRoleCodesByUserId(userId);

        // 获取用户权限编码列表
        List<String> permissionCodes = permissionMapper.selectCodesByUserId(userId);

        // 构建用户权限DTO
        UserPermissionDTO dto = new UserPermissionDTO();
        dto.setRoles(roleCodes);
        dto.setPermissions(permissionCodes);

        return dto;
    }

    /**
     * 获取用户的角色编码列表
     *
     * @param userId 用户ID
     * @return 角色编码列表
     */
    @Override
    public List<String> getUserRoleCodes(Long userId) {
        try {
            return userRoleMapper.selectRoleCodesByUserId(userId);
        } catch (Exception e) {
            // 在遇到数据库错误时返回默认角色
            return Collections.singletonList("ROLE_USER");
        }
    }
}
